#!/usr/bin/env node

const fs = require('fs');
const path = require('path');
const { execSync } = require('child_process');
const readline = require('readline');
const chalk = require('chalk');

// 创建控制台输入接口
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

// 打印欢迎信息
console.log(chalk.blue.bold('\n=== 学生选课系统初始化向导 ===\n'));

// 检查是否已安装依赖
const checkDependencies = () => {
  console.log(chalk.cyan('检查项目依赖...'));
  
  if (!fs.existsSync('node_modules')) {
    console.log(chalk.yellow('未找到 node_modules 目录，正在安装依赖...'));
    execSync('npm install', { stdio: 'inherit' });
  } else {
    console.log(chalk.green('✓ 项目依赖已安装'));
  }
};

// 配置环境变量
const setupEnvironment = async () => {
  console.log(chalk.cyan('\n配置环境变量...'));
  
  // 检查 .env 文件是否存在
  if (fs.existsSync('.env')) {
    const answer = await askQuestion('.env 文件已存在，是否要覆盖？(y/n) ');
    if (answer.toLowerCase() !== 'y') {
      console.log(chalk.yellow('跳过环境变量配置'));
      return;
    }
  }
  
  // 复制 .env.example 到 .env
  if (fs.existsSync('.env.example')) {
    fs.copyFileSync('.env.example', '.env');
    console.log(chalk.green('✓ 已创建 .env 文件'));
    
    // 生成随机的 JWT 密钥
    const envContent = fs.readFileSync('.env', 'utf8');
    const jwtSecret = generateRandomString(64);
    const updatedEnv = envContent.replace(
      /JWT_SECRET=.*/,
      `JWT_SECRET=${jwtSecret}`
    );
    fs.writeFileSync('.env', updatedEnv);
    console.log(chalk.green('✓ 已生成随机的 JWT 密钥'));
  } else {
    console.log(chalk.red('错误: 未找到 .env.example 文件'));
    process.exit(1);
  }
};

// 初始化数据库
const setupDatabase = async () => {
  console.log(chalk.cyan('\n初始化数据库...'));
  
  try {
    // 运行数据库迁移
    console.log('运行数据库迁移...');
    execSync('npx sequelize-cli db:migrate', { stdio: 'inherit' });
    
    // 运行种子数据
    const answer = await askQuestion('是否要导入示例数据？(y/n) ');
    if (answer.toLowerCase() === 'y') {
      console.log('导入种子数据...');
      execSync('npx sequelize-cli db:seed:all', { stdio: 'inherit' });
    }
    
    console.log(chalk.green('✓ 数据库初始化完成'));
  } catch (error) {
    console.error(chalk.red('数据库初始化失败:'), error);
    process.exit(1);
  }
};

// 生成随机字符串
const generateRandomString = (length) => {
  const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()_+~`|}{[]:;?><,./-=';
  let result = '';
  for (let i = 0; i < length; i++) {
    result += chars.charAt(Math.floor(Math.random() * chars.length));
  }
  return result;
};

// 询问问题
const askQuestion = (question) => {
  return new Promise((resolve) => {
    rl.question(chalk.blue(question), (answer) => {
      resolve(answer);
    });
  });
};

// 主函数
const main = async () => {
  try {
    // 检查依赖
    checkDependencies();
    
    // 配置环境变量
    await setupEnvironment();
    
    // 初始化数据库
    await setupDatabase();
    
    console.log(chalk.green.bold('\n✓ 项目初始化完成！'));
    console.log(chalk.blue('\n接下来，你可以运行以下命令启动开发服务器：'));
    console.log(chalk.cyan('  npm run dev'));
    console.log(chalk.blue('\n访问以下地址查看 API 文档：'));
    console.log(chalk.cyan('  http://localhost:3000/api-docs'));
    
    process.exit(0);
  } catch (error) {
    console.error(chalk.red('初始化过程中出错:'), error);
    process.exit(1);
  } finally {
    rl.close();
  }
};

// 运行主函数
main();
